﻿Imports System.Windows.Forms
Imports System.IO
Imports Microsoft.Vbe.Interop
Imports Microsoft.Office.Tools.Ribbon
Imports Microsoft.Office.Interop.Word
Imports Adres = Chiroredactie2007.My.Resources.WebOpzoekingUrl
Imports Chiroredactie2007.My.Resources

Public Class EindredactieRibbon

    Private opzoeking As WebOpzoeking
    Private conv As Conversie

    Private programmafolder As String
    Private instellingenfolderpad As String

#Region " Event handlers "

    Private Sub EindredactieRibbon_Load(ByVal sender As Object, ByVal e As RibbonUIEventArgs) Handles Me.Load
        ' Locatie van instellingsbestanden controleren.
        programmafolder = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

        If Not Directory.Exists(Path.Combine(programmafolder, "Chirojeugd-Vlaanderen vzw\Chiroredactie voor MS Word")) Then
            programmafolder = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
        End If

        instellingenfolderpad = Path.Combine(programmafolder, "Chirojeugd-Vlaanderen vzw\Chiroredactie voor MS Word\AppData")

        ' Controle voor dev-versie
        If Not File.Exists(Path.Combine(instellingenfolderpad, "Chiroredactie.dic")) Then
            MessageBox.Show(OntbrekendeOntwikkelaarsbestandenWaarschuwingString, FoutString, MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
        End If

        If My.Settings.LaatsteGebruikerVersie <> My.Application.Info.Version.ToString() Then
            ' OPM: woordenboek moet eigenlijk maar één keer geïmporteerd worden, daarna blijft de verwijzing altijd goed, ook na update
            WoordenboekImporteren("Chiroredactie.dic")

            ' Macrobestanden importeren (van txt-bestanden, want bas-bestanden worden 'gecorrigeerd' door VS. De ontbrekende haakjes zorgen 
            ' voor compilatiefouten is VS, terwijl de automatisch bijgewerkte bestanden compilatiefouten geven in Word.
            MacrobestandImporteren("Redactiebewerkingen.txt")
            MacrobestandImporteren("Sneltoetsen.txt")

            ' Sneltoetsen opnieuw instellen
            Try
                Globals.ThisAddIn.Application.Run("Sneltoetsen.SneltoetsenInstellen")
            Catch ex As Exception
                Loggen(ex)
            End Try

            ' OPM: blijkbaar wordt dat in XenApp niet (juist) opgeslagen
            My.Settings.LaatsteGebruikerVersie = My.Application.Info.Version.ToString()
            My.Settings.Save()
        End If
    End Sub

#Region " Opzoekingen "

    ''' <summary>
    ''' Gebruik de geselecteerde tekst voor een opzoeking in de online Taaldatabanken van de VRT
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub VrtTaalButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) Handles VrtTaalButton.Click
        opzoeking = New WebOpzoeking(Adres.VrtTaal)
        opzoeking.Uitvoeren()
    End Sub

    ''' <summary>
    ''' Gebruik de geselecteerde tekst voor een opzoeking in het online Groene Boekje
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub GroeneBoekjeButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) Handles GroeneBoekjeButton.Click
        opzoeking = New WebOpzoeking(Adres.GroeneBoekje)
        opzoeking.Uitvoeren()
    End Sub

    ''' <summary>
    ''' Gebruik de geselecteerde tekst voor een opzoeking in de online Van Dale
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub VanDaleButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) Handles VanDaleButton.Click
        opzoeking = New WebOpzoeking(Adres.VanDale)
        opzoeking.Uitvoeren()
    End Sub

    ''' <summary>
    ''' Gebruik de geselecteerde tekst voor een opzoeking op Google
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub GoogleButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) Handles GoogleButton.Click
        opzoeking = New WebOpzoeking(Adres.Google)
        opzoeking.Uitvoeren()
    End Sub

    ''' <summary>
    ''' Gebruik de geselecteerde tekst voor een opzoeking in de Wikipedia
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub WikiPediaButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) Handles WikiPediaButton.Click
        opzoeking = New WebOpzoeking(Adres.WikiPedia)
        opzoeking.Uitvoeren()
    End Sub

    ''' <summary>
    ''' Gebruik de geselecteerde tekst voor een opzoeking op Taaladvies.net
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub TaaladviesButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) Handles TaaladviesButton.Click
        opzoeking = New WebOpzoeking(Adres.Taaladvies)
        opzoeking.Uitvoeren()
    End Sub

    ''' <summary>
    ''' Gebruik de geselecteerde tekst voor een opzoeking op Woorden.org
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub WoordenboekButton_Click(ByVal sender As System.Object, ByVal e As RibbonControlEventArgs) Handles WoordenboekButton.Click
        opzoeking = New WebOpzoeking(Adres.WoordenOrg)
        opzoeking.Uitvoeren()
    End Sub

    ''' <summary>
    ''' Gebruik de geselecteerde tekst voor een opzoeking op Spreekwoorden.nl
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub SpreekwoordenButton_Click(ByVal sender As System.Object, ByVal e As RibbonControlEventArgs) Handles SpreekwoordenButton.Click
        opzoeking = New WebOpzoeking(Adres.Spreekwoorden)
        opzoeking.Uitvoeren()
    End Sub

    ''' <summary>
    ''' Gebruik de geselecteerde tekst voor een opzoeking op taaltelefoon.vlaanderen.be
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub TaalTelefoonButton_Click(ByVal sender As System.Object, ByVal e As RibbonControlEventArgs) Handles TaaltelefoonButton.Click
        opzoeking = New WebOpzoeking(Adres.Taaltelefoon)
        opzoeking.Uitvoeren()
    End Sub

    ''' <summary>
    ''' Gebruik de geselecteerde tekst voor een opzoeking op synoniemen.net
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub SynoniemenButton_Click(ByVal sender As System.Object, ByVal e As RibbonControlEventArgs) Handles SynoniemenButton.Click
        opzoeking = New WebOpzoeking(Adres.SynoniemenNet)
        opzoeking.Uitvoeren()
    End Sub

    ''' <summary>
    ''' Gebruik de geselecteerde tekst voor een opzoeking op encyclo.nl
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub EncycloButton_Click(ByVal sender As System.Object, ByVal e As RibbonControlEventArgs) Handles EncycloButton.Click
        opzoeking = New WebOpzoeking(Adres.Encyclo)
        opzoeking.Uitvoeren()
    End Sub

#End Region

#Region "Opzoekingen voor feedback"

    Private Sub TekstfeedbackButton_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles TekstfeedbackButton.Click
        Cursor.Current = Cursors.WaitCursor

        Try
            Eindredactie.RedactiefeedbackGeven()
        Catch ex As Exception
            Loggen(ex)
            MessageBox.Show(RedactiefeedbackFoutgelopenWaarschuwingString, FoutString, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
        End Try

        Cursor.Current = Cursors.Default
    End Sub

    Private Sub TellenButton_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles TellenButton.Click
        Cursor.Current = Cursors.WaitCursor

        Dim wtv As New WoordentellingVenster
        wtv.Show()

        Cursor.Current = Cursors.Default
    End Sub

#End Region

#Region " Conversies "

    ''' <summary>
    ''' Pas de geselecteerde opsomming aan volgens lay-outafspraken binnen de Chiro
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ConverteerOpsommingButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) _
     Handles ConverteerOpsommingButton.Click
        Try
            conv = New Conversie
            conv.OpsommingsTekensConverteren()
        Catch ex As Exception
            Loggen(ex)
            MessageBox.Show(ex.Message, FoutString, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
        End Try
    End Sub

    ''' <summary>
    ''' Pas de geselecteerde genummerde opsomming aan volgens lay-outafspraken binnen de Chiro
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ConverteerNummeringButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) _
     Handles ConverteerNummeringButton.Click
        Try
            conv = New Conversie
            conv.OpsommingsNummersConverteren()
        Catch ex As Exception
            Loggen(ex)
            MessageBox.Show(ex.Message, FoutString, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
        End Try
    End Sub

    ''' <summary>
    ''' Pas het geselecteerde telefoonnummer aan volgens afspraken binnen de Chiro, 
    ''' die gebaseerd zijn op de BIN-normen
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub TelefoonnummerButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) _
     Handles TelefoonnummerButton.Click
        Try
            conv = New Conversie
            conv.TelefoonNummerConverteren()
        Catch ex As Exception
            Loggen(ex)
            MessageBox.Show(ex.Message, FoutString, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
        End Try
    End Sub

    Private Sub CodeKaderButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) Handles CodeKaderButton.Click
        Try
            conv = New Conversie
            conv.KaderConverteren()
        Catch ex As Exception
            Loggen(ex)
            MessageBox.Show(ex.Message, FoutString, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
        End Try
    End Sub

    Private Sub CustomCodeButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) _
     Handles CustomCodeButton.Click
        Dim tekst As String
        tekst = InputBox("Welke lay-outaanwijzing wil je rond de geselecteerde tekst zetten?")
        CodeInvoegen(tekst)
    End Sub

    Private Sub CodeVetButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) Handles CodeVetButton.Click
        Globals.ThisAddIn.Application.Selection.Font.Bold = True
        CodeInvoegen("vet")
    End Sub

    Private Sub CodeCursiefButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) _
     Handles CodeCursiefButton.Click
        Globals.ThisAddIn.Application.Selection.Font.Italic = True
        CodeInvoegen("cursief")
    End Sub

    Private Sub NominaliseringButton_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles NominaliseringButton.Click
        conv = New Conversie()
        conv.NominaliseringOmzetten()
    End Sub

    Private Sub NevenschikkingButton_Click(ByVal sender As System.Object, ByVal e As RibbonControlEventArgs) Handles NevenschikkingButton.Click
        conv = New Conversie()
        conv.NevenschikkingOmdraaien()
    End Sub

    Private Sub WatBetreftButton_Click(ByVal sender As System.Object, ByVal e As RibbonControlEventArgs) Handles WatBetreftButton.Click
        conv = New Conversie()
        conv.WatBetreftHerschikken()
    End Sub

    Private Sub WerkwoordgroepButton_Click(ByVal sender As System.Object, ByVal e As RibbonControlEventArgs) Handles WerkwoordgroepButton.Click
        conv = New Conversie()
        conv.WerkwoordgroepOrdenen()
    End Sub

#End Region

#Region " Redactiewerk "

    Private Sub UitvoeringButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) Handles EindredactieButton.Click
        Cursor.Current = Cursors.WaitCursor
        Try
            Eindredactie.Uitvoeren()
        Catch ex As Exception
            Loggen(ex)
            MessageBox.Show(ex.Message, FoutString, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
        End Try
        Cursor.Current = Cursors.Default

        If MessageBox.Show(RedactiefeedbackVraagString, VraagString, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) = DialogResult.Yes Then
            Cursor.Current = Cursors.WaitCursor

            Try
                Eindredactie.RedactiefeedbackGeven()
            Catch ex As Exception
                Loggen(ex)
                MessageBox.Show(RedactiefeedbackFoutgelopenWaarschuwingString, FoutString, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
            End Try

            Cursor.Current = Cursors.Default
        End If

        MessageBox.Show(RedactiefeedbackAlsOpmerkingInfoString, InfoString, MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
    End Sub

    Private Sub EindredactieVoltooienButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) Handles EindredactieVoltooienButton.Click
        Eindredactie.Afsluiten()
    End Sub

    Private Sub RedactieGroup_DialogLauncherClick(ByVal sender As Object, ByVal e As RibbonControlEventArgs) Handles RedactieGroup.DialogLauncherClick
        ' todo: instellingenform
        MessageBox.Show(NogNietGeïmplementeerdString, FoutString, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
    End Sub

    Private Sub VervangButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) Handles VervangButton.Click
        Dim form As New InstellingenVervangingVenster
        Dim verb As New Vervanging
        Dim oudWoord As String
        Dim nieuwWoord As String

        If form.ShowDialog() = DialogResult.OK Then
            oudWoord = form.ZoekwoordTextBox.Text
            nieuwWoord = form.VervangwoordTextBox.Text

            If form.BevestigingCheckBox.Checked = True Then
                ' verb.VervangMetBevestiging(
            Else
                verb.Vervangen(oudWoord, nieuwWoord)
            End If
        End If

        If Not form Is Nothing Then
            form.Close()
        End If
    End Sub

    Private Sub VervangMetOptiesButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) _
     Handles VervangMetOptiesButton.Click
        Dim vervangform As New VervangMetOptiesVenster
        vervangform.VervangingenUitvoeren()
        If Not vervangform Is Nothing Then
            vervangform.Close()
        End If
    End Sub

    Private Sub PlatteOpsommingButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) _
     Handles PlatteOpsommingButton.Click
        Try
            conv = New Conversie
            conv.OpsommingNaarPlatteTekstConverteren()
        Catch ex As Exception
            Loggen(ex)
            MessageBox.Show(ex.Message, FoutString, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
        End Try
    End Sub

    Private Sub PlatKaderButton_Click(ByVal sender As Object, ByVal e As RibbonControlEventArgs) Handles PlatKaderButton.Click
        Try
            conv = New Conversie
            conv.KaderVerwijderen()
        Catch ex As Exception
            Loggen(ex)
            MessageBox.Show(ex.Message, FoutString, MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
        End Try
    End Sub

#End Region

#Region " Taalcorrectie "

    Private Sub HuisstijlButton_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles HuisstijlButton.Click
        If System.Windows.Forms.Application.OpenForms.Count = 0 OrElse System.Windows.Forms.Application.OpenForms.Item("HuisstijlVenster") Is Nothing Then
            If MessageBox.Show(OpmaakOpsommingenWaarschuwingString, VraagString, MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1) = DialogResult.Yes Then
                Dim frm As New HuisstijlVenster
                frm.Show()
            End If
        ElseIf System.Windows.Forms.Application.OpenForms.Item("HuisstijlVenster") IsNot Nothing Then
            System.Windows.Forms.Application.OpenForms.Item("HuisstijlVenster").Activate()
        End If
    End Sub

#End Region

#End Region

#Region " Helper methods "

    ''' <summary>
    ''' Zet lay-outcodes rond de selectie.
    ''' </summary>
    ''' <param name="tekst">De tekst die als lay-outcode moet dienen</param>
    ''' <remarks>Voor de selectie staat de opgegeven tekst, erachter staat diezelfde tekst maar met 'einde' ervoor</remarks>
    Private Sub CodeInvoegen(ByVal tekst As String)
        Try
            conv = New Conversie
            conv.AanwijzingInvoegen(tekst)
        Catch ex As Exception
            Loggen(ex)
            MessageBox.Show(ex.Message.ToString)
        End Try
    End Sub

    Private Sub WoordenboekImporteren(ByVal BestandsnaamParam As String)
        Dim pad As String

        ' Verwijder eventuele eerdere versie van het Chirowoordenboek
        For i = 1 To Globals.ThisAddIn.Application.CustomDictionaries.Count
            If Globals.ThisAddIn.Application.CustomDictionaries(i).Name.ToLower() = BestandsnaamParam.ToLower() Then
                Globals.ThisAddIn.Application.CustomDictionaries(i).Delete()
            End If
        Next

        ' Voeg nieuwe versie toe

        ' De volgende zaken zijn zo ingesteld in ChiroredactieSetup. Let dus op als je iets verandert!
        ' OPM: Dat betekent wel dat je het pad niet mag veranderen tijdens de installatie!
        ' OPM: SpecialFolder.ProgramFiles verwijst naar C:\Program Files. Dat werkt dus alleen als de installer x64 is.

        My.Settings.Verbeteringsinstellingenpad = instellingenfolderpad
        My.Settings.Save()

        pad = Path.Combine(instellingenfolderpad, BestandsnaamParam)

        Try
            If File.Exists(pad) Then
                Globals.ThisAddIn.Application.CustomDictionaries.Add(pad).LanguageSpecific = False
            End If
        Catch ex As Exception
            Loggen(ex)
            MessageBox.Show(WoordenboekImporterenMisluktString)
        End Try
    End Sub

    ''' <summary>
    ''' Verwijdert een eerdere versie van de macromodule (op basis van naam) en vervangt ze door de huidige versie
    ''' </summary>
    ''' <param name="BestandsnaamParam">De bestandsnaam van de macromodule die geïmporteerd moet worden</param>
    ''' <remarks>
    ''' Deze operatie verwijdert alle sneltoetsverwijzingen! 
    ''' TODO: Mag dus enkel bij een nieuwe versie gebeuren, en de gebruiker moet gewaarschuwd worden.
    ''' </remarks>
    Private Sub MacrobestandImporteren(ByVal BestandsnaamParam As String)
        Dim macropad As String
        Dim naam As String

        naam = Left(BestandsnaamParam, BestandsnaamParam.Length - 4)
        macropad = Path.Combine(instellingenfolderpad, BestandsnaamParam)

        For Each comp As VBComponent In Globals.ThisAddIn.Application.NormalTemplate.VBProject.VBComponents
            If comp.Name = naam Then
                Try
                    Globals.ThisAddIn.Application.NormalTemplate.VBProject.VBComponents.Remove(comp)
                Catch ex As Exception
                    Loggen(ex)
                    MessageBox.Show(ex.Message)
                End Try
            End If
        Next

        Try
            Globals.ThisAddIn.Application.NormalTemplate.VBProject.VBComponents.Import(macropad)
        Catch ex As Exception
            Loggen(ex)
            MessageBox.Show(MacrobestandImporterenMislukt)
        End Try
    End Sub

#End Region

    Private Sub PlatteTabelTabsButton_Click(ByVal sender As System.Object, ByVal e As RibbonControlEventArgs) Handles PlatteTabelTabsButton.Click
        conv = New Conversie()
        conv.KaderVerwijderen(WdTableFieldSeparator.wdSeparateByTabs)
    End Sub

    Private Sub PlatteTabelAlineaButton_Click(ByVal sender As System.Object, ByVal e As RibbonControlEventArgs) Handles PlatteTabelAlineaButton.Click
        conv = New Conversie()
        conv.KaderVerwijderen(WdTableFieldSeparator.wdSeparateByParagraphs)
    End Sub

End Class